package utils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;

import model.Entidade;
import model.Operacao;

public class Utils {

	public static void printDB(Entidade database) {
		String s = database.getName()+" - id: "+database.getId();
		System.out.println(s);
		for(Entidade tab : database.getChildren()){
			s = "	"+tab.getName()+" - id: "+tab.getId()+"			";
			System.out.println(s);
			for (Entidade pag : tab.getChildren()) {
				s = "		"+pag.getName()+" - id: "+pag.getId()+"			";
				System.out.println(s);
				for(Entidade row : pag.getChildren()){
					s = "			"+row.getName()+" - id: "+row.getId()+"			";
					System.out.println(s);
				}
			}
		}
	}

	public static Entidade initializeDB() {
		int id = 0;
		Entidade dbo = new Entidade(Entidade.DATABASE, "database", ++id, null);
		Entidade tab = null;
		Entidade page = null;
		for (int i = 1; i < 3; i++) {
			++id;
			tab = new Entidade(Entidade.PAGE, "tab"+id, id, dbo);
			for (int j = 1; j < 3; j++) {
				++id;
				page = new Entidade(Entidade.PAGE, "page"+id, id, tab);
				for (int k = 1; k < 4; k++) {
					++id;
					Entidade row = new Entidade(Entidade.ROW, "row"+id, id, page);
					page.getChildren().add(row);
					
				}
				tab.getChildren().add(page);
			}
			dbo.getChildren().add(tab);
		}
		return dbo;
	}

//	public static HashMap<String, Entidade> initializeDBtoMap() {
//		int id = 0;
//		Entidade dbo = new Entidade(Entidade.DATABASE, "database", ++id, null);
//		HashMap<String, Entidade> retorno = new HashMap<String, Entidade>();
//		retorno.put(dbo.getName(), dbo);
//		Entidade tab = null;
//		Entidade page = null;
//		for (int i = 1; i < 3; i++) {
//			++id;
//			tab = new Entidade(Entidade.TABLE, "tab"+id, id, dbo);
//			retorno.put(tab.getName(), tab);
//			for (int j = 1; j < 3; j++) {
//				++id;
//				page = new Entidade(Entidade.PAGE, "page"+id, id, tab);
//				retorno.put(page.getName(), page);
//				for (int k = 1; k < 4; k++) {
//					++id;
//					Entidade row = new Entidade(Entidade.ROW, "row"+id, id, page);
//					retorno.put(row.getName(), row);
//					page.getChildren().add(row);
//					
//				}
//				tab.getChildren().add(page);
//			}
//			dbo.getChildren().add(tab);
//		}
//		return retorno;
//	}
	
	public static HashMap<String, Entidade> initializeDBtoMap() {
		int id = 0;
		Entidade dbo = new Entidade(Entidade.TABLE, "X", ++id, null);
		HashMap<String, Entidade> retorno = new HashMap<String, Entidade>();
		retorno.put(dbo.getName(), dbo);
		Entidade tab = null;
		Entidade page = null;
		++id;
		tab = new Entidade(Entidade.PAGE, "Y", id, dbo);
		retorno.put(tab.getName(), tab);
		++id;
		page = new Entidade(Entidade.ROW, "U", id, tab);
		retorno.put(page.getName(), page);
		++id;
		page = new Entidade(Entidade.ROW, "V", id, tab);
		retorno.put(page.getName(), page);
		tab.getChildren().add(page);
		dbo.getChildren().add(tab);
		return retorno;
	}

	public static ArrayList<Operacao> getListaOperacoes(String schedule) {
	    ArrayList<Operacao> retorno = new ArrayList<Operacao>();
	
	    String[] operacoes = schedule.split("\\|");
	    for (String operacao : operacoes) {
	        String[] campos = operacao.split(" ");
	        String acao = campos[0].trim();
	        Operacao op;
	        if (acao.equalsIgnoreCase("C")) {
	            op = new Operacao(acao, Integer.parseInt(campos[1].trim()), "");
	        } else {
	            op = new Operacao(campos[0].trim(), Integer.parseInt(campos[1].trim()), campos[2].trim());
	        }
	
	        retorno.add(op);
	    }
	    return retorno;
	}

	public static void printMapDB(HashMap<String, Entidade> database) {
		Iterator<Entry<String, Entidade>> ite = database.entrySet().iterator();
		while(ite.hasNext()){
			Entry<String, Entidade> entry = ite.next();
			Entidade e = entry.getValue();
			String value = "";
			for (int i = 0; i < e.getType()*2; i++) {
				value += " ";
			}
			System.out.println(value+e.getName());
		}
	}

}
